<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
<head>
  <link href="//gmpg.org/xfn/11" rel="profile">
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <meta name="generator" content="Hugo 0.68.3" />

  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">

  <title> &middot; 我的博客</title>

  
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/print.css" media="print">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/poole.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/syntax.css">
  <link type="text/css" rel="stylesheet" href="/my_technology_blog/css/hyde.css">
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700">


  
  <link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png">
  <link rel="shortcut icon" href="/favicon.png">

  
  
</head>

  <body class="theme-base-0b ">
  <aside class="sidebar">
  <div class="container sidebar-sticky">
    <div class="sidebar-about">
      <a href="/my_technology_blog/"><h1>我的博客</h1></a>
      <p class="lead">
       杨博的博客 
      </p>
    </div>

    <nav>
      <ul class="sidebar-nav">
        <li><a href="/my_technology_blog/">Home</a> </li>
        
      </ul>
    </nav>

    <p>&copy; 2021. All rights reserved. </p>
  </div>
</aside>

    <main class="content container">
    <div class="post">
  <h1></h1>
  <time datetime=0001-01-01T00:00:00Z class="post-date">Mon, Jan 1, 0001</time>
  <h2 id="三次握手">三次握手</h2>
<ul>
<li>第一次握手：客户端给服务器发送一个 <strong>syn</strong> 包，这是客户端进入等待连接状态</li>
<li>第二次握手：服务器接收到 <strong>syn</strong> 包，然后发送一个 <strong>ack+syn</strong> 包，表示我收到了</li>
<li>第三次握手：客户端接收到 <strong>ack+syn</strong> 包，这时再发送一个 <strong>ack</strong> 包，这个包发送完毕后，服务器和客户端就连接上了，三次握手也到此结束</li>
</ul>
<p><strong>通俗理解</strong> 就是：</p>
<ol>
<li>Client：嘿，李四，是我，听到了吗？</li>
<li>Server：我听到了，你能听到我的吗?</li>
<li>Client：好的，我们互相都能听到对方的话，我们的通信可以开始了。</li>
</ol>
<p>​</p>
<h2 id="四次挥手">四次挥手</h2>
<ul>
<li>第一次挥手：主动关闭方向被动关闭方发送一个 <strong>FIN</strong> 包，告诉被动关闭方 我的数据已经发送完了。这时主动关闭方还可以接收数据</li>
<li>第二次握手：被动关闭方接收到 <strong>FIN</strong> 包，给主动关闭方发送一个 <strong>ACK</strong> 包。</li>
<li>第三次挥手：被动关闭方发送一个 <strong>FIN</strong> 包，告诉主动关闭方我的数据也发送完了，可以关闭连接</li>
<li>第四次挥手：主动关闭方接收到 <strong>FIN</strong> 包，再发送一个 <strong>ACK</strong> 包，发送完毕。四次挥手到此结束</li>
</ul>
<p><strong>通俗理解</strong> 就是：</p>
<ol>
<li>Client：我所有东西都说完了</li>
<li>Server：我已经全部听到了，但是等等我，我还没说完</li>
<li>Server：好了，我已经说完了</li>
<li>Client：好的，那我们的通信结束l</li>
</ol>
<h2 id="常见问题">常见问题</h2>
<ol>
<li>为什么握手要三次，挥手要四次
<ul>
<li><input disabled="" type="checkbox"> 因为当Server端收到Client端的SYN连接请求报文后，可以直接发送SYN+ACK报文。其中ACK报文是用来应答的，SYN报文是用来同步的。但是关闭连接时，当Server端收到FIN报文时，很可能并不会立即关闭SOCKET，所以只能先回复一个ACK报文，告诉Client端，&ldquo;你发的FIN报文我收到了&rdquo;。只有等到我Server端所有的报文都发送完了，我才能发送FIN报文，因此不能一起发送。故需要四步握手。</li>
</ul>
</li>
</ol>

</div>


    </main>

    
  </body>
</html>
